"""  
Module Name:    GZRDownload_cmd  
Module Desc:    国家自然科学基金结题报告下载程序

Module Version: 0.1 测试版 
Changes:        Initial release.  
  
Author:         TMRNic
Contact:        yangxiaokang495@163.com
Websitr:        http://www.navspace.tech
Date:           2023-10-01
  
Dependencies:   python3 x64
  
Notes:          程序没有加入错误检查，所以严格按照要求输入
                没有设计上下页，也没有UI交互逻辑，所以项目列表仅列出前20项
"""

from PIL import Image  
from io import BytesIO
import os
import shutil
import re
from fpdf import FPDF
import GZRWeb

MAX_LEN = 20        # 最大报告数

def sort_key(filename):
    """  
    使用一个简单的正则表达式来提取文件名中的数字
  
    参数：  
    - filename: 提取数字的文件名  
  
    返回：  
    - return_value: 返回数字或文件名
    """  
    match = re.search(r'(\d+)', filename)  
    if match:  
        return int(match.group(1))  
    else:  
        return filename  


def convert_images_to_pdf(image_folder, output_pdf):
    """  
    将文件夹中的图片合成PDF文件  
  
    参数：  
    - image_folder: 图片文件夹  
    - output_pdf:   输出pdf文件名  
  
    返回：  
    - return_value: NULL  
    """  
    pdf = FPDF()
    pdf.set_auto_page_break(0)  # 自动分页设为False
    imagelist = [i for i in os.listdir(image_folder)]
    for image in sorted(imagelist, key=sort_key):
        imgpath = os.path.join(image_folder, image)
        # 打开图片文件
        img = Image.open(imgpath)  
        # 获取图片的尺寸  
        width, height = img.size
        if width>height:        # 横向图片转存
            imgR = img.rotate(90, expand=True)
            imgR.save(imgpath)
        pdf.add_page()
        pdf.image(imgpath, x=0, y=0, w=210, h=297)  # 指定宽高
    pdf.output(output_pdf, "F")


def show_list(report_list):
    """  
    显示加载的报告列表  
  
    参数：  
    - report_list: 报告列表  
  
    返回：  
    - return_value: NULL  
    """
    item_len = len(report_list)
    if item_len>MAX_LEN:
        item_len = MAX_LEN
    for i in range(item_len):
        print('----------------------------------------------------------------------')
        print(str(i+1)+ '. ' + report_list[i][1])
        print('批准号: '+report_list[i][2]+'  项目类别: '+report_list[i][3]+'  申请代码: '+report_list[i][14])
        print('依托单位: '+report_list[i][4]+'  项目负责人: '+report_list[i][5])
        print('资助经费: '+report_list[i][6]+'  批准年度: '+report_list[i][7]+'  结题年度: '+report_list[i][15])
        print('关键词: '+report_list[i][8])
        print('\n开题摘要:\n    '+report_list[i][19])
        print('\n结题摘要:\n    '+report_list[i][20])
    print('----------------------------------------------------------------------')
   
# 程序启动+信息检索
while True:
    print('+--------------------------------------------------------------------+')
    print('|                                                                    |')
    print('|                                                                    |')
    print('|               \033[1;36m自然基金信息信息检索&结题报告下载程序\033[0m                |')
    print('|                            v0.1 测试版                             |')
    print('|                                                                    |')
    print('|                           \033[1;34mAuthor:TMRNic\033[0m                            |')
    print('|                             \033[1;31m2023-10-01\033[0m                             |')
    print('|                                                                    |')
    print('|                                                                    |')
    print('|                                                                    |')
    print('|                        \033[1;32mwww.navspace.tech\033[0m                           |')
    print('|                                                                    |')
    print('+--------------------------------------------------------------------+')
    keyword = input('输入搜索关键字:')    # 输入关键字
    res = GZRWeb.search(keyword)        # 搜索
    itemLen = len(res)                  # 获取数据长度，UI中翻页使用，暂时没有用
    show_list(res)                      # 显示数据，用于选择下载项 

    print('下载报告输入序号后回车，例如：“1”，“15”；重新搜索直接回车。')
    cmd = input('>>')                   # 输入现在项的序号
    if cmd.isdigit():                   # 非数字则直接返回
        sel_report = int(cmd)-1
        ReportID = res[sel_report][0]   # 获取reportID
        ReportName = res[sel_report][1] # 报告名称
        ReportAuthor = res[sel_report][5]   # 报告作者
        GZRWeb.getImages(ReportID)      # 下载图片报告
        # img2pdf
        image_folder = r".content"      # 图片文件夹
        output_pdf = ReportName + '_' + ReportAuthor + r".pdf"      # 报告文件名
        convert_images_to_pdf(image_folder, output_pdf)     # 图片转pdf
        shutil.rmtree(image_folder)     # 删除图片
        os.removedirs(image_folder)     # 删除文件夹
    else:
        break                           # 回到启动界面

    
  
